package net.linku.utils;

import org.springframework.http.HttpHeaders;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * UserHolderUtil 工具类用于从请求头中读取租户信息和获取当前用户ID。
 *
 * @author
 */
public class UserHolderUtil {

    private static final String TENANT_HEADER = "X-Tenant-ID";

    /**
     * 从当前请求上下文中获取租户ID。
     *
     * @return 租户ID，如果请求头中不存在该信息，则返回 null。
     */
    public static String getTenantId() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes instanceof ServletRequestAttributes) {
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            return request.getHeader(TENANT_HEADER);
        }
        return null;
    }

    /**
     * 从 HttpServletRequest 中获取租户ID。
     *
     * @param request HttpServletRequest 对象。
     * @return 租户ID，如果请求头中不存在该信息，则返回 null。
     */
    public static String getTenantIdFromRequest(HttpServletRequest request) {
        return request.getHeader(TENANT_HEADER);
    }

    /**
     * 从 HttpHeaders 中获取租户ID。
     *
     * @param headers HttpHeaders 对象。
     * @return 租户ID，如果请求头中不存在该信息，则返回 null。
     */
    public static String getTenantIdFromHeaders(HttpHeaders headers) {
        return headers.getFirst(TENANT_HEADER);
    }

    /**
     * 获取当前用户的ID。
     *
     * @return 当前用户的ID，如果用户未登录则返回 -1。
     */
    public static Long getUserId() {
        Long userId = null;
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // 从安全的上下文中获取用户ID
        if (authentication != null) {
            String principal = authentication.getPrincipal().toString(); // userId ->Long  anonymousUser
            if ("anonymousUser".equals(principal)) { // 用户未登录访问时是这个用户
                userId = Long.valueOf(-1);
            } else {
                userId = Long.valueOf(principal);
            }
        }
        return userId;
    }
}
